﻿using System;
using System.Collections.Generic;
using System.Runtime.Caching;

namespace CommonLib.RuntimeCache
{
    public enum MyCachePriority
    {
        Default,
        NotRemovable
    }

    public class CacheItemClass
    {
        #region 融资信息

        /// <summary>
        ///     融资总金额
        /// </summary>
        public long Financing { get; set; }

        /// <summary>
        ///     融资份额
        /// </summary>
        public long FinancingShare { get; set; }

        /// <summary>
        ///     最大投资份数
        /// </summary>
        public long InvestmentMax { get; set; }

        /// <summary>
        ///     最小投资份数
        /// </summary>
        public long InvestmentMin { get; set; }

        ///// <summary>
        /////     投资单位(元/份)---单份融资金额
        ///// </summary>
        public long InvestmentUnit { get; set; }

        #endregion 融资信息

        #region 产品信息

        /// <summary>
        ///     产品的协议
        /// </summary>
        /// <value>The agreement ids.</value>
        public string AgreementIds { get; set; }

        /// <summary>
        ///     年化率(原版：Yield)
        /// </summary>
        public long AnnualRate { get; set; }

        //追加年化率
        /// <summary>
        ///     追加年化率
        /// </summary>
        /// <value>The append annual rate.</value>
        public long AppendAnnualRate { get; set; }

        /// <summary>
        ///     审核信息
        /// </summary>
        /// <value>The audit message.</value>
        public string AuditMessage { get; set; }

        /// <summary>
        ///     定投产品【起息日期(原版：ValueDate )】
        /// </summary>
        public DateTime? DateOfValue { get; set; }

        /// <summary>
        ///     定投产品：【 结息日期(原版：SettleDate )】
        /// </summary>
        public DateTime? ExpireDate { get; set; }

        /// <summary>
        ///     融资份数
        /// </summary>
        /// <value>The financing number.</value>
        public long FinancingNumber { get; set; }

        /// <summary>
        ///     已售卖份数
        /// </summary>
        /// <value>The financing sale.</value>
        public long FinancingSale { get; set; }

        /// <summary>
        ///     已售卖金额
        /// </summary>
        /// <value>The financing sale amount.</value>
        public long FinancingSaleAmount { get; set; }

        /// <summary>
        ///     担保方式
        /// </summary>
        public string GuarantyType { get; set; }

        /// <summary>
        ///     投资去向--一个标识
        ///     默认值是1,
        ///     标记资产打包的项目的去向,比如:在自己平台上售卖/在其他平台售卖/托管其他公司资产项目
        /// </summary>
        public string InvestmentType { get; set; }

        /// <summary>
        ///     产品名字(老系统项目池：项目名称)
        /// </summary>
        /// <value>The name.</value>
        public string Name { get; set; }

        /// <summary>
        ///     周期
        /// </summary>
        public long Period { get; set; }

        /// <summary>
        ///     期数(原版的IssueNo)
        /// </summary>
        /// <value>The period number.</value>
        public long PeriodNumber { get; set; }

        /// <summary>
        ///     产品融资类型
        /// </summary>
        /// <value>The product categoty.</value>
        public long? ProductCategory { get; set; }

        /// <summary>
        ///     产品融资类型名称
        /// </summary>
        /// <value>The product categoty.</value>
        public string ProductCategoryName { get; set; }

        /// <summary>
        ///     业务主键
        /// </summary>
        public string ProductId { get; set; }

        /// <summary>
        ///     产品匹配模式
        /// </summary>
        /// <value>The product match mode.</value>
        public string ProductMatchMode { get; set; }

        /// <summary>
        ///     产品编号(老系统中对应项目中-项目billno)
        /// </summary>
        /// <value>The product no.</value>
        public string ProductNo { get; set; }

        /// <summary>
        ///     产品类型
        /// </summary>
        /// <value>The type of the product.</value>
        public long ProductType { get; set; }

        /// <summary>
        ///     产品属性类型===标记是否为空包产品
        /// </summary>
        /// <value>The product type attribute.</value>
        public string ProductTypeAttribute { get; set; }

        /// <summary>
        ///     募集完成时间
        /// </summary>
        public DateTime? RaiseDateTime { get; set; }

        /// <summary>
        ///     定投：【最迟还款日期(原版：RepaymentDeadline )】
        /// </summary>
        public DateTime? RepaymentLatestDate { get; set; }

        /// <summary>
        ///     单份融资金额(原版：UnitPrice)
        /// </summary>
        /// <value>The single financing total.</value>
        public long SingleFinancingTotal { get; set; }

        /// <summary>
        ///     产品状态
        /// </summary>
        /// <value>The status.</value>
        public string Status { get; set; }

        #endregion 产品信息

        #region 产品新增字段

        /// <summary>
        ///     停售时间. (老系统 issueEndTime)
        /// </summary>
        public DateTime? EndSellTime { get; set; }

        /// <summary>
        ///     募集总金额，以“分”为单位
        /// </summary>
        /// <value>The financing sum amount.</value>
        public long FinancingSumAmount { get; set; }

        /// <summary>
        ///     客户端信息==兼容老系统
        /// </summary>
        /// <value>The information.</value>
        public string Info { get; set; }

        /// <summary>
        ///     发行编号.
        /// </summary>
        /// <value>The issue no.</value>
        public int IssueNo { get; set; }

        /// <summary>
        ///     发行时间（产品上线时间）
        /// </summary>
        public DateTime? IssueTime { get; set; }

        /// <summary>
        ///     定投产品：【质押物编号（如果是产品单资产则有一个值,否则为空）】
        /// </summary>
        /// <value>The pledge no.</value>
        public string PledgeNo { get; set; }

        ///// <summary>
        /////     产品类型
        ///// </summary>
        ///// <value>The product category.</value>
        //public long ProductCategory { get; set; }

        /// <summary>
        ///     募集完成时间
        /// </summary>
        public DateTime? RaisedDateTime { get; set; }

        /// <summary>
        ///     定投产品：【是否还款】
        /// </summary>
        public bool Repaid { get; set; }

        /// <summary>
        ///     定投产品：【还款时间】
        /// </summary>
        public DateTime? RepaidTime { get; set; }

        /// <summary>
        ///     是否已售罄
        /// </summary>
        /// <value><c>true</c> if [sold out]; otherwise, <c>false</c>.</value>
        public bool SoldOut { get; set; }

        /// <summary>
        ///     售罄时间
        /// </summary>
        /// <value>The sold out time.</value>
        public DateTime? SoldOutTime { get; set; }

        public DateTime? StartSellTime { get; set; }

        /// <summary>
        ///     先判断是否是指定日期起息；为0，则为购买当日起息，为n，则为T+n日起息；为-n，则为T-n日起息
        /// </summary>
        /// <value>The value date mode.</value>
        public long ValueDateMode { get; set; }

        #endregion 产品新增字段

        #region 导航关系

        //         public virtual InvestProject InvestProject { get; set; }
        //
        //         public virtual ICollection<AssetAllocation> AssetAllocations { get; set; }

        #endregion 导航关系
    }

    public class CacheTestClass
    {
        public CacheTestClass()
        {
            this.CacheItems = new List<CacheItemClass>();
        }

        public IList<CacheItemClass> CacheItems { get; set; }
        public int ItemCount { get; set; }
        public int ItemIndex { get; set; }
        public int TotalCount { get; set; }
    }

    public class MyCache
    {
        // Gets a reference to the default MemoryCache instance.
        public static readonly ObjectCache cache = MemoryCache.Default;

        static MyCache()
        {
            for (int i = 0; i < 30000; i++)
            {
                AddToMyCache(i.ToString(), new CacheTestClass
                {
                    ItemIndex = i,
                    ItemCount = 10,
                    TotalCount = 100000000,
                    CacheItems = GetCacheItems()
                }, MyCachePriority.Default, new List<string>());
            }
        }

        public static void AddToMyCache(string CacheKeyName, object CacheItem,
            MyCachePriority MyCacheItemPriority, List<string> FilePath)
        {
            CacheItemPolicy policy = new CacheItemPolicy
            {
                Priority = (MyCacheItemPriority == MyCachePriority.Default) ?
                    CacheItemPriority.Default : CacheItemPriority.NotRemovable,
                //AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.00),
                RemovedCallback = MyCachedItemRemovedCallback
            };
            //policy.ChangeMonitors.Add(new HostFileChangeMonitor(FilePath));

            // Add inside cache
            cache.Set(CacheKeyName, CacheItem, policy);
        }

        public static IList<CacheItemClass> GetCacheItems()
        {
            IList<CacheItemClass> items = new List<CacheItemClass>();
            for (int i = 0; i < 10; i++)
            {
                items.Add(
                    new CacheItemClass { Financing = i, AgreementIds = "AgreementIds" + i, Info = @"从上图可以看出，中国各个省份的油价不尽相同，以93号汽油为例，最低的是吉林为5.36元/升，最高的北京为5.56元/升。

考虑到美国的人均收入远远高于中国，而油价却比中国便宜，许多亲们觉得这简直是让人狗带的节奏！事实上，这些内幕你知道么？

美国油价为什么相对便宜？

首先，在历史上美国是对原油开发利用较早的国家，从1859年在宾夕法尼亚打出了第一口油井到二战之后的一段时间里，世界能源版图被称之为“墨西哥湾时代”，美国一度掌握世界原油产量的2/3。而彼时中国的石油年产量仅为12万吨。

其次，美国是一个资源丰富的国家，石油储量远超中国。据《BP世界能源统计年鉴2015》数据，截至2014年底，美国石油探明储量为48.5，中国为18.5（单位：十亿桶）。不容忽略的是，美国人口不到中国的四分之一，一个“油多人少”，而另一个“油少人多”。

第三，也是很重要的一点，美国之所以油价低，与美国政府的政策有关。美国向来对石油资源的争夺和控制特别用心，从美国在中东地区一些产油国长年派驻军队可见一斑。政府此举保障了美国海外石油供应的稳定性，但同时相当于为石油供应的隐性成本埋了单，这些都压低了美国的油价。

所以，亲们明白了，在资源保障上，中国和美国真的没法比。

中国油价为什么看上去“贵”？

众所周知，到达终端消费者的油价不仅包含原油价格，还有炼油、输油、加油站等各个环节的成本和利润，最后还需要加上燃油税。相较美国，由于技术和资源等方面因素，目前中国生产成品油成本较高，但影响中美两国油价最关键的因素，其实还是税！

和中国不同的是，在美国，买东西价是价，税是税，也就是说，实际上美国人加一升油还要额外掏一份税金。美国各州的税率不一，纽约州、北卡罗来纳州和加利福尼亚州的成品油税最高，分别是每加仑交42.4、40.7和39.5美分的税。以每升汽油2.6元为例，如果在纽约州，最后实际要付的价格是3.31元左右。

但在中国，我们的实际消费价和税是混合在一起的，而不是价税分离。按照我国的成品油价格结构，油价中48%为各种税费。以5.67元/升的92号汽油为例，如果刨去税款的话，那么每升价格应为2.95元，与美国多数加油站的价格实际上是持平的。

说完这些，你就明白为什么中国油价比美国“贵”了。

事实上，以2016年1月全球汽油价格网发布的世界油价排行榜来看，中国的油价其实属于中间偏低，有许多比中国收入水平低得多的国家，油价比中国还贵。

此外，大多数发达国家也比中国油价高，美国只是个“例外”。以欧洲为例，德国成品油消费税为57%、韩国为52%。最典型的当属挪威，它年产石油1亿吨左右，是一个产油大国，但是油价最高时可达9.68美元/加仑，约合人民币16.66元/升，足足比国内高了两倍" }
                    );
            }
            return items;
        }

        public static object GetMyCachedItem(string CacheKeyName)
        {
            //
            return cache[CacheKeyName];
        }

        public static void RemoveMyCachedItem(string CacheKeyName)
        {
            //
            if (cache.Contains(CacheKeyName))
            {
                cache.Remove(CacheKeyName);
            }
        }

        private static void MyCachedItemRemovedCallback(CacheEntryRemovedArguments arguments)
        {
            // Log these values from arguments list
            string.Concat("Reason: ", arguments.RemovedReason.ToString(), " | Key - Name: ", arguments.CacheItem.Key, " | Value - Object: ",
                arguments.CacheItem.Value.ToString());
        }
    }
}